package com.swiftride.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.swiftride.pojo.domain.Order;
import com.swiftride.pojo.param.ConfirmFeesParam;
import com.swiftride.pojo.param.CreateOrderParam;
import com.swiftride.pojo.param.DriverOrderParam;
import com.swiftride.pojo.vo.DriverLocationVo;
import com.swiftride.pojo.vo.DriverOrderMonthVo;
import com.swiftride.pojo.vo.OrderDetailVo;
import com.swiftride.pojo.vo.OrderInfoVo;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author wy
 * @since 2024-08-10
 */
public interface IOrderService extends IService<Order> {

    //----------业务实现方法----------

    /**
     * 创建订单
     *
     * @param createOrderParam 下单信息
     * @return 订单信息
     */
    Order createOrder(CreateOrderParam createOrderParam);

    /**
     * 司机拉取订单
     *
     * @return 订单信息视图集合
     */
    List<OrderInfoVo> driverPullOrder();

    /**
     * 司机秒杀订单
     *
     * @param orderNo 订单编号
     * @return 订单信息
     */
    Order killOrder(String orderNo);

    /**
     * 乘客取消订单
     *
     * @param orderNo 订单编号
     */
    void customerCancelOrder(String orderNo);

    /**
     * 司机取消订单
     *
     * @param orderNo 订单编号
     */
    void driverCancelOrder(String orderNo);

    /**
     * 到达代驾点
     *
     * @param orderNo 订单编号
     */
    void arriveStartPlace(String orderNo);

    /**
     * 开始代驾
     *
     * @param orderNo 订单编号
     */
    void startDriving(String orderNo);

    /**
     * 结束代驾
     *
     * @param orderNo       订单编号
     * @param totalDistance 总里程
     */
    void endDriving(String orderNo, BigDecimal totalDistance);

    /**
     * 司机确认收费
     *
     * @param confirmFeesParam 确认收费参数
     */
    void confirmFees(ConfirmFeesParam confirmFeesParam);

    //----------业务查询方法----------

    /**
     * 获取订单编号对应的订单且该订单必须处于进行中的订单
     *
     * @param orderNo 订单编号
     * @return 订单信息
     */
    Order getProgressOrder(String orderNo);

    /**
     * 乘客查询订单详情
     *
     * @param orderNo 订单编号
     * @return 订单明细
     */
    OrderDetailVo getCustomerOrderDetail(String orderNo);

    /**
     * 司机查询订单详情
     *
     * @param orderNo 订单编号
     * @return 订单详情
     */
    OrderDetailVo getDriverOrderDetail(String orderNo);

    /**
     * 乘客定时获取当前订单是否被接单
     * 因为定时频繁查询,在redis中获取订单来判度订单是否被接单
     *
     * @param orderNo 订单编号
     * @return ture:订单已经接单;false:订单未被接单
     */
    Boolean getOrderAccept(String orderNo);

    /**
     * 获取司机在GRO中获取司机实时位置
     *
     * @param driverId 司机id
     * @return 司机位置视图
     */
    DriverLocationVo getDriverLocation(String driverId);

    //----------小程序页面退出后重新进入,维护页面的方法----------

    /**
     * 乘客获取最近一次订单
     *
     * @return 订单信息
     */
    Order getCustomerLastOrder();

    /**
     * 司机获取工作状态
     *
     * @return 订单信息
     */
    Order getDriverWorkStatus();

    /**
     * 司机查询订单
     *
     * @param driverOrderParam 司机订单查询条件
     * @return 司机订单按月分组视图
     */
    List<DriverOrderMonthVo> getDriverOrder(DriverOrderParam driverOrderParam);
}
